package com.lw.controller;

import ch.qos.logback.core.util.StringUtil;
import cn.dev33.satoken.stp.StpUtil;
import com.fasterxml.jackson.core.io.UTF32Reader;
import com.lw.common.other.LogOperation;
import com.lw.common.utils.ResultVo;
import com.lw.entity.TbUser;
import com.lw.entity.TbUserInterface;
import com.lw.service.TbUserInterfaceService;
import com.lw.service.TbUserService;
import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import jakarta.annotation.Resource;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.beans.factory.annotation.Autowired;
import com.lw.entity.TbInterface;
import com.lw.service.TbInterfaceService;
// 导入 springdoc-openapi 相关注解
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 控制层。
 *
 * @author lw
 * @since 2025年04月29日 11:35:15
 */
@RestController
// 使用 @Tag 替换 @Api
@Tag(name = "接口服务接口", description = "TbInterface 相关接口")
@RequestMapping("/tbInterface")
public class TbInterfaceController {

    @Resource
    private TbInterfaceService tbInterfaceService;

    @Resource
    private TbUserInterfaceService tbUserInterfaceService;

    @Resource
    private TbUserService userService;

    /**
     * 添加。
     *
     * @param tbInterface 要添加的 TbInterface 实体对象
     * @return 操作结果，包含添加是否成功的信息
     */
    @PostMapping("save")
    @LogOperation("接口-保存")
    @Operation(summary = "保存", description = "保存一个新的 TbInterface 实体")
    public ResultVo<Boolean> save(@RequestBody
                                  @Parameter(description = "要添加的 TbInterface 实体对象") TbInterface tbInterface) {
        //创建时间
        tbInterface.setCreateTime(LocalDateTime.now());
        boolean result = tbInterfaceService.save(tbInterface);
        return ResultVo.success(result);
    }

    /**
     * 根据主键删除。
     *
     * @param id 主键
     * @return 操作结果，包含删除是否成功的信息
     */
    @DeleteMapping("remove/{id}")
    @LogOperation("接口-删除")
    @Operation(summary = "根据主键删除", description = "根据传入的主键删除对应的 TbInterface 记录")
    public ResultVo<Boolean> remove(@PathVariable
                                    @Parameter(description = "主键") Integer id) {
        boolean result = tbInterfaceService.removeById(id);
        return ResultVo.success(result);
    }

    /**
     * 根据主键更新。
     *
     * @param tbInterface 包含更新信息的 TbInterface 实体对象
     * @return 操作结果，包含更新是否成功的信息
     */
    @PutMapping("update")
    @Operation(summary = "根据主键更新", description = "根据传入的 TbInterface 实体更新对应记录")
    @LogOperation("接口-更新")
    public ResultVo<Boolean> update(@RequestBody
                                    @Parameter(description = "包含更新信息的 TbInterface 实体对象") TbInterface tbInterface) {
        //更新时间
        tbInterface.setUpdateTime(LocalDateTime.now());
        boolean result = tbInterfaceService.updateById(tbInterface);
        return ResultVo.success(result);
    }

    /**
     * 查询所有。
     *
     * @return 操作结果，包含所有 TbInterface 数据
     */
    @GetMapping("list")
    @Operation(summary = "查询所有", description = "获取所有 TbInterface 记录")
    public ResultVo<List<TbInterface>> list() {
        List<TbInterface> data = tbInterfaceService.list();
        return ResultVo.success(data);
    }

    @GetMapping("getInterfaceByUser")
    @Operation(summary = "查询所有", description = "获取所有 TbInterface 记录")
    public ResultVo<List<TbInterface>> getInterfaceByUser() {
        Integer loginId = StpUtil.getLoginIdAsInt();
        if (loginId == null) {
            return ResultVo.error("未登录");
        }
        List<TbInterface> data = tbInterfaceService.getInterfaceByUserId(loginId);
        return ResultVo.success(data);
    }

    /**
     * 根据主键获取详细信息。
     *
     * @param id 主键
     * @return 操作结果，包含详情信息
     */
    @GetMapping("getInfo/{id}")
    @Operation(summary = "根据主键获取", description = "根据主键获取 TbInterface 详细信息")
    public ResultVo<TbInterface> getInfo(@PathVariable
                                         @Parameter(description = "主键") Integer id) {
        TbInterface data = tbInterfaceService.getById(id);
        return ResultVo.success(data);
    }

    /**
     * 分页查询。
     *
     * @return 操作结果，包含分页数据
     */
    @GetMapping("page")
    @Operation(summary = "分页查询", description = "对 TbInterface 记录进行分页查询")
    public ResultVo<Page<TbInterface>> page(TbInterface tbInterface, @RequestParam(defaultValue = "1") int pageNumber,
                                            @RequestParam(defaultValue = "10") int pageSize) {
        Page page = new Page(pageNumber, pageSize);
        // 构建查询条件
        QueryWrapper queryWrapper = new QueryWrapper();
        // 可以根据需要添加其他查询条件
        if (StringUtils.hasLength(tbInterface.getName())) {
            queryWrapper.like("name", tbInterface.getName());
        }
        //编号
        if (StringUtils.hasLength(tbInterface.getCode())) {
            queryWrapper.like("code", tbInterface.getCode());
        }
        //类型
        if (StringUtils.hasLength(tbInterface.getType())) {
            queryWrapper.eq("type", tbInterface.getType());
        }
        //状态
        if (StringUtils.hasLength(tbInterface.getStatus())) {
            queryWrapper.eq("status", tbInterface.getStatus());
        }
        String loginId = StpUtil.getLoginIdAsString();
        TbUser tbUser = userService.getById(loginId);
        //非管理员，只看到自己的接口 ，暂时这么定 by lw on 2025年5月7日 18:51:28
        if (tbUser != null && !"admin".equals(tbUser.getLoginName())) {
            QueryWrapper tbUserInterfaceQueryWrapper = new QueryWrapper();
            tbUserInterfaceQueryWrapper.eq("user_id", loginId);
            List<TbUserInterface> list = tbUserInterfaceService.list(tbUserInterfaceQueryWrapper);
            List<Integer> interfaceIds = list.stream().map(TbUserInterface::getInterfaceId).toList();
            if (interfaceIds.isEmpty()) {
                return ResultVo.success(new Page<TbInterface>());
            }
            queryWrapper.in("id", interfaceIds);
        }
        queryWrapper.orderBy("id", false);
        Page<TbInterface> data = tbInterfaceService.page(page, queryWrapper);
        return ResultVo.success(data);
    }
}